#include "com_llsydn_ndkdemo_CJavaJNI.h"
#include <string.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
/**
 *
 * c语言调用java语言（利用反射技术）
 *
 */

/*
 * C代码调用java中的加法运算
 * Class:     com_llsydn_ndkdemo_CJavaJNI
 * Method:    callbackAdd
 * Signature: (II)I
 */
JNIEXPORT void JNICALL Java_com_llsydn_ndkdemo_CJavaJNI_callbackAdd(JNIEnv* env, jobject jobj){
    //1.得到字节码
    //jclass      (*FindClass)(JNIEnv*, const char*);
    jclass jclazz = (*env)->FindClass(env,"com/llsydn/ndkdemo/CJavaJNI");
    //2.得到方法
    //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    //最后一个参数是方法签名 （javap -s 包名.类名即可得到该类的中所有方法签名）
    jmethodID jmethodIDs= (*env)->GetMethodID(env,jclazz,"add","(II)I");
    //3.实例化该类
    // jobject     (*AllocObject)(JNIEnv*, jclass);
    jobject  jobject =(*env)->AllocObject(env,jclazz);
    //4.调用方法
    //jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
    jint value =  (*env)->CallIntMethod(env,jobject,jmethodIDs,99,1);
    LOGE("value===%d\n",value);
};


/*
 * C代码调用java中的静态方法 static void sayHello(String s)
 * Class:     com_llsydn_ndkdemo_CJavaJNI
 * Method:    callbackHello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_llsydn_ndkdemo_CJavaJNI_callbackHello(JNIEnv * env, jobject jobj){
    //1.得到字节码
    //jclass      (*FindClass)(JNIEnv*, const char*);
    jclass jclazz = (*env)->FindClass(env,"com/llsydn/ndkdemo/CJavaJNI");
    //2.得到方法
    //jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
    //最后一个参数是方法签名（javap -s 包名.类名即可得到该类的中所有方法签名）
    jmethodID jmethodIDs= (*env)->GetStaticMethodID(env,jclazz,"hello","(Ljava/lang/String;)V");
    //3.实例化该类
    //void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
    jstring jst = (*env)->NewStringUTF(env,"I am android1223");
    (*env)->CallStaticVoidMethod(env,jclazz,jmethodIDs,jst);
    //成功调用了static void sayHello(String s)
}

/*
 * C代码调用java中的方法 更新Ui
 * Class:     com_llsydn_ndkdemo_CJavaJNI
 * Method:    callbackCallUi
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_llsydn_ndkdemo_MainActivity_callbackCallUi(JNIEnv* env, jobject jobj){
     //1.得到字节码
    //jclass      (*FindClass)(JNIEnv*, const char*);
    jclass jclazz = (*env)->FindClass(env,"com/llsydn/ndkdemo/MainActivity");
    //2.得到方法
    //jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
    //最后一个参数是方法签名（javap -s 包名.类名即可得到该类的中所有方法签名）
    jmethodID jmethodIDs= (*env)->GetMethodID(env,jclazz,"callUi","()V");
    //3.实例化该类（不需要了，只需要传进来的 实例jobj）
    // jobject     (*AllocObject)(JNIEnv*, jclass);
    //jobject  jobject =(*env)->AllocObject(env,jclazz);
    //4.调用方法
    //void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env,jobj,jmethodIDs);
}